package com.lzh.persevere.utils;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class HtmlHeadingIdProcessor {

    // 用于处理标题文本，生成slug（确保ID符合HTML规范：仅包含字母、数字、连字符、下划线）
    private static final Pattern INVALID_CHARS_PATTERN = Pattern.compile("[^a-zA-Z0-9\\-\\_]");

    public static void main(String[] args) {
        // 示例HTML内容
        String html = "<html> <body> <h1>Java 教程</h1> <h2>第一章：入门指南</h2> <h2>第二章：基本语法</h2> <h3>变量与类型</h3> <h3>变量与类型</h3> <!-- 重复标题，需生成唯一ID --> <h4>整数类型</h4> </body> </html>";

        // 处理HTML，为标题添加唯一ID
        String processedHtml = addUniqueIdsToHeadings(html);
        System.out.println(processedHtml);
    }

    /**
     * 为HTML中的所有h1-h6标签添加唯一ID
     *
     * @param html 原始HTML字符串
     * @return 处理后的HTML字符串
     */
    public static String addUniqueIdsToHeadings(String html) {
        // 1. 解析HTML文档
        Document doc = Jsoup.parse(html);

        // 2. 选择所有h1到h6标签
        Elements headings = doc.select("h1, h2, h3, h4, h5, h6");

        // 3. 记录已生成的ID，确保唯一性（处理重复标题）
        Map<String, Integer> idCounter = new HashMap<>();

        // 4. 遍历每个标题，生成并添加唯一ID
        for (Element heading : headings) {
            // 获取标题文本（去除前后空格）
            String headingText = heading.text().trim();

            // 生成基础slug（处理中文、特殊字符）
            String baseId = generateSlug(headingText);

            // 处理重复ID：如果已存在，添加序号（如"variable-type" → "variable-type-2"）
            String uniqueId = getUniqueId(baseId, idCounter);

            // 为标题标签添加id属性
            heading.attr("id", uniqueId);
        }

        // 5. 返回处理后的HTML
        return doc.html();
    }

    /**
     * 将标题文本转换为符合HTML规范的slug（用于生成ID）
     * 规则：小写字母、空格转连字符、移除特殊字符
     */
    private static String generateSlug(String text) {
        if (text.isEmpty()) {
            return "heading"; // 空标题的默认ID
        }

        // 处理中文：可选项，如需保留中文可跳过此步（HTML允许中文ID，但建议用英文）
        // 这里示例：直接保留中文（Jsoup支持中文ID），仅处理特殊字符
        String slug = text.toLowerCase()
                .replaceAll("\\s+", "-") // 空格替换为连字符
                .replaceAll(INVALID_CHARS_PATTERN.pattern(), ""); // 移除无效字符

        // 避免以连字符开头/结尾
        slug = slug.replaceAll("^-+", "").replaceAll("-+$", "");

        return slug.isEmpty() ? "heading" : slug;
    }

    /**
     * 确保ID唯一：如果重复，添加序号（如"chapter-1" → "chapter-1-2"）
     */
    private static String getUniqueId(String baseId, Map<String, Integer> idCounter) {
        // 首次出现，直接使用baseId
        if (!idCounter.containsKey(baseId)) {
            idCounter.put(baseId, 1);
            return baseId;
        }

        // 重复出现，添加序号（如baseId=2 → "baseId-2"）
        int count = idCounter.get(baseId) + 1;
        idCounter.put(baseId, count);
        return baseId + "-" + count;
    }
}